package persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import logica.Area;
import logica.UsuarioRegistrado;
import excepciones.DAOExcepcion;

public class AreaDAOImp extends GenericHSQLDB implements IAreaDAO {

	public AreaDAOImp() throws DAOExcepcion {
		super();
	}

	@Override
	public void crearArea(Area area) throws DAOExcepcion {

		try {

			UsuarioRegistradoDAOImp urDAO = new UsuarioRegistradoDAOImp();

			connManager.connect();

			connManager.updateDB("insert into AREA (NOMBRE,NIF) values ('" + area.getNombre() + "','"
					+ area.getEditorArea().getNif() + "')");

			urDAO.actualizaUsuarioRegistradoEditaAreaPorNif(area);

			connManager.close();
		} catch (DAOExcepcion e) {
			throw e;
		}

	}

	@Override
	public Area encontrarAreaPorNombre(String ID) throws DAOExcepcion {

		try {
			connManager.connect();

			ResultSet rs = connManager
					.queryDB("select ar.NOMBRE as NOMBREAREA,ar.NIF,us.NOMBREUSUARIO, us.CONTRASENYA,us.EMAIL,us.AREASINTERES,us.ALERTADO,p.NOMBRE as NOMBRE, p.APELLIDOS from AREA as ar, USUARIOREGISTRADO as us, PERSONA as p where ar.nombre= '"
							+ ID + "' and us.NIF=ar.NIF");
			connManager.close();

			try {
				if (rs.next()) {
					return new Area(rs.getString("NOMBREAREA"), new UsuarioRegistrado(rs.getString("NIF"),
							rs.getString("NOMBRE"), rs.getString("APELLIDOS"), rs.getString("NOMBREUSUARIO"),
							rs.getString("CONTRASENYA"), rs.getString("EMAIL"), rs.getString("AREASINTERES"),
							rs.getBoolean("ALERTADO")));
				} else {
					return null;
				}
			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}
		} catch (DAOExcepcion e) {
			throw e;
		}

	}

	@Override
	public List<Area> getAreaList() throws DAOExcepcion {
		try {
			connManager.connect();
			ResultSet rs = connManager
					.queryDB("select ar.NOMBRE as NOMBREAREA,ar.NIF,us.NOMBREUSUARIO, us.CONTRASENYA,us.EMAIL,us.AREASINTERES,us.ALERTADO,p.NOMBRE, p.APELLIDOS from AREA as ar, USUARIOREGISTRADO as us, PERSONA as p where us.NIF=ar.NIF and p.NIF=us.NIF");
			connManager.close();
			List<Area> areas = new ArrayList<Area>();
			try {
				while (rs.next()) {
					Area ur = new Area(rs.getString("NOMBREAREA"), new UsuarioRegistrado(rs.getString("NIF"),
							rs.getString("NOMBRE"), rs.getString("APELLIDOS"), rs.getString("NOMBREUSUARIO"),
							rs.getString("CONTRASENYA"), rs.getString("EMAIL"), rs.getString("AREASINTERES"),
							rs.getBoolean("ALERTADO")));
					areas.add(ur);
				}
				return areas;
			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}
		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	@Override
	public Area encontrarAreaPorNombreUsuario(String nom) throws DAOExcepcion {

		UsuarioRegistradoDAOImp urDAO = new UsuarioRegistradoDAOImp();

		try {
			connManager.connect();
			ResultSet rs = connManager.queryDB("select NOMBRE_AREA from AREA where NOMBRE_USUARIO= '" + nom + "'");
			connManager.close();

			try {

				if (rs.next()) {

					UsuarioRegistrado user = urDAO.encontrarUsuarioRegistradoPorNombreUsuario(nom);
					return new Area(rs.getString("NOMBRE_AREA"), user);

				} else {
					return null;
				}

			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}

		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	@Override
	public List<Area> encontrarAreas() throws DAOExcepcion {

		try {
			connManager.connect();
			ResultSet rs = connManager.queryDB("select * from AREA");
			connManager.close();
			List<Area> listaAreas = new ArrayList<Area>();
			try {
				while (rs.next()) {
					Area a = this.encontrarEditorArea(rs.getString("NOMBRE_AREA"));
					listaAreas.add(a);
				}
				return listaAreas;
			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}
		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	@Override
	public Area encontrarEditorArea(String name) throws DAOExcepcion {

		UsuarioRegistradoDAOImp urDAO = new UsuarioRegistradoDAOImp();

		try {
			connManager.connect();

			ResultSet rs = connManager.queryDB("select NOMBRE_AREA, NOMBRE_USUARIO from AREA where NOMBRE_AREA= '"
					+ name + "'");
			connManager.close();

			try {
				if (rs.next()) {

					UsuarioRegistrado user = urDAO.encontrarUsuarioRegistradoPorNombreUsuario(rs
							.getString("NOMBRE_USUARIO"));

					if (user != null) {
						return new Area(name, user);
					} else {
						return null;
					}

					/* P: fa falta que afegim aci el usuari com editor? */
					/*
					 * R: No, en el caso de que usuarioRegistrado sea
					 * EditorDeArea dicha información debería estar en la BD.
					 */

				} else {
					return null;
				}
			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}

		} catch (DAOExcepcion e) {
			throw e;
		}
	}

}
